001 /*
002 * Copyright 2005 Stephen J. McConnell
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
013 * implied.
014 *
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package net.dpml.library.info;
020
021 import java.util.Arrays;
022 import java.util.Properties;
023
024 /**
025 * The ModuleDirective class describes a module data-structure.
026 *
027 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
028 * @version 1.1.0
029 */
030 public final class ModuleDirective extends ResourceDirective
031 {
032 private final ResourceDirective[] m_resources;
033
034 /**
035 * Creation of a new module directive. If the resource name if composite
036 * then the resource directive will be a module directive instance that either
037 * encloses the resource or enclosed a resource containing the resource.
038 *
039 * @param name the resource name
040 * @param version the resource version
041 * @param classifier LOCAL or EXTERNAL classifier
042 * @param basedir the project basedir
043 * @param info info descriptor
044 * @param data datatypes produced by the resource
045 * @param dependencies resource dependencies
046 * @param properties suppliementary properties
047 * @param filters project filters
048 * @param resources subsidary resources
049 * @return the immediate enclosing resource
050 */
051 public static ModuleDirective createModuleDirective(
052 String name, String version, Classifier classifier, String basedir,
053 InfoDirective info, DataDirective[] data,
054 DependencyDirective[] dependencies, Properties properties,
055 FilterDirective[] filters, ResourceDirective[] resources )
056 {
057 int n = name.indexOf( "/" );
058 if( n > -1 )
059 {
060 ModuleDirective enclosing = null;
061 String[] elements = name.split( "/", -1 );
062 for( int i = ( elements.length-1 ); i>-1; i-- )
063 {
064 String elem = elements[i];
065 if( i == ( elements.length-1 ) )
066 {
067 enclosing =
068 new ModuleDirective(
069 elem, version, classifier, basedir, info, data, dependencies,
070 resources, properties, filters );
071 }
072 else
073 {
074 enclosing =
075 new ModuleDirective(
076 elem, null, Classifier.EXTERNAL, null, null,
077 new DataDirective[0], new DependencyDirective[0],
078 new ResourceDirective[]{enclosing}, null, null );
079 }
080 }
081 return enclosing;
082 }
083 else
084 {
085 return new ModuleDirective(
086 name, version, classifier, basedir, info, data, dependencies,
087 resources, properties, filters );
088 }
089 }
090
091 /**
092 * Creation of a new module directive supporting the establishment
093 * of an anonymous resource.
094 *
095 * @param name the module name
096 * @param version the module version
097 * @param resource resource contained within the module
098 */
099 public ModuleDirective( String name, String version, ResourceDirective resource )
100 {
101 this(
102 name, version, Classifier.ANONYMOUS, null, null,
103 new DataDirective[0], new DependencyDirective[0],
104 new ResourceDirective[]{resource}, null, null );
105 }
106
107 /**
108 * Creation of a new module directive.
109 * @param name the resource name
110 * @param version the resource version
111 * @param classifier LOCAL or EXTERNAL classifier
112 * @param basedir the project basedir
113 * @param info info descriptor
114 * @param data datatypes produced by the resource
115 * @param dependencies resource dependencies
116 * @param resources resource included within the module
117 * @param properties suppliementary properties
118 * @param filters project filters
119 */
120 public ModuleDirective(
121 String name, String version, Classifier classifier, String basedir,
122 InfoDirective info, DataDirective[] data,
123 DependencyDirective[] dependencies, ResourceDirective[] resources,
124 Properties properties, FilterDirective[] filters )
125 {
126 super( name, version, classifier, basedir, info, data, dependencies, properties, filters );
127
128 if( null == resources )
129 {
130 throw new NullPointerException( "resources" );
131 }
132 for( int i=0; i<resources.length; i++ )
133 {
134 if( null == resources[i] )
135 {
136 throw new NullPointerException( "resource [" + i + "]" );
137 }
138 }
139 m_resources = resources;
140 }
141
142 /**
143 * Return an array of resource directives representing the resources within
144 * the module.
145 * @return the nested resource directives
146 */
147 public ResourceDirective[] getResourceDirectives()
148 {
149 return m_resources;
150 }
151
152 /**
153 * Compare this object with another for equality.
154 * @param other the other object
155 * @return true if equal
156 */
157 public boolean equals( Object other )
158 {
159 if( super.equals( other ) && ( other instanceof ModuleDirective ) )
160 {
161 ModuleDirective object = (ModuleDirective) other;
162 return Arrays.equals( m_resources, object.m_resources );
163 }
164 else
165 {
166 return false;
167 }
168 }
169
170 /**
171 * Compute the hash value.
172 * @return the hashcode value
173 */
174 public int hashCode()
175 {
176 int hash = super.hashCode();
177 hash ^= super.hashArray( m_resources );
178 return hash;
179 }
180 }